package com.woniuxy.springbootrabbitmq.configuration;

import lombok.extern.log4j.Log4j2;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

/**
 * @Author: linKe
 * @Date: 2022/1/12 11:18
 * @FileName: CallbackConfiguration
 * @version: 1.0
 * @Description: 配置生产者  confirm 和  return
 */
@Log4j2
@Configuration
public class CallbackConfiguration implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {
    @Autowired
    RabbitTemplate rabbitTemplate;

    /**
     * 开启监听设置
     * 构造器 属性赋值
     * ·@PostConstruct（init） 初始化
     * ·@PreDestroy（destroy） 销毁之前
     * 其他生命周期都需要实现接口
     *
     * PostConstruct 注解用于需要在依赖注入完成后执行任何初始化的方法。
     * 必须在类投入使用之前调用此方法。 所有支持依赖注入的类都必须支持这个注解。
     * 即使类没有请求注入任何资源，也必须调用用 PostConstruct 注释的方法。
     * 这个注解只能注解一种方法。
     */
    @PostConstruct
    public  void setUp(){
        // 在开始调用之前，将自己注入进来
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnCallback(this);

    }

    /**
     * confirm  生产者消息确认配置类
     * @param correlationData       关联数据
     * @param ack   为true时 为ack false 为nack
     * @param cause 原因
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        log.info("confirm");
        log.info("correlationData:"+correlationData);
        log.info("ack:"+ack);
        log.info("cause:"+cause);

    }

    /**
     * return   生产者return配置类
     * @param message   消息
     * @param replyCode 回复代码
     * @param replyText 回复内容
     * @param exchange  交换机
     * @param routingKey  路由键（默认情况下是队列名）
     */
    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        log.info("return");
        log.info("message:"+message);
        log.info("replyCode:"+replyCode);
        log.info("replyText:"+replyText);
        log.info("exchange:"+exchange);
        log.info("routingKey:"+routingKey);
    }
}
